#!/usr/bin/env python3
"""
深入检查 setuptools.setup() 的工作机制
"""

import sys
import os

# 尝试导入 setuptools（如果可用）
try:
    from setuptools import setup
    from setuptools.dist import Distribution
    import inspect
    setuptools_available = True
    print("✓ setuptools 可用")
except ImportError:
    setuptools_available = False
    print("✗ setuptools 不可用")

if setuptools_available:
    print("\n=== setuptools.setup() 函数分析 ===")
    
    # 1. 查看 setup 函数的签名
    print("1. setup() 函数签名:")
    sig = inspect.signature(setup)
    print(f"   {sig}")
    
    # 2. 查看 setup 函数的源码位置
    print("\n2. setup() 函数位置:")
    try:
        source_file = inspect.getfile(setup)
        print(f"   文件: {source_file}")
        
        # 获取源码的前几行
        source_lines = inspect.getsourcelines(setup)
        print(f"   起始行: {source_lines[1]}")
        print("   前10行源码:")
        for i, line in enumerate(source_lines[0][:10], source_lines[1]):
            print(f"   {i:3}: {line.rstrip()}")
    except:
        print("   无法获取源码")
    
    # 3. 分析 Distribution 类（setup() 的核心）
    print("\n3. Distribution 类分析 (setup() 的核心):")
    print(f"   类位置: {inspect.getfile(Distribution)}")
    
    # 4. 模拟 setup() 调用过程
    print("\n4. 模拟 setup() 内部过程:")
    
    class MockDistribution:
        def __init__(self, **attrs):
            print(f"   Distribution.__init__ 接收到的参数: {list(attrs.keys())}")
            
            # 检查命令行参数
            print(f"   检查 sys.argv: {sys.argv}")
            
            # 模拟解析命令行
            if len(sys.argv) > 1:
                print(f"   检测到命令: {sys.argv[1:]}")
                self._parse_command_line()
            
            self.attrs = attrs
        
        def _parse_command_line(self):
            """模拟命令行解析过程"""
            print("   -> 解析命令行参数...")
            print("   -> 创建对应的 Command 对象...")
            print("   -> 设置命令参数...")
        
        def run_commands(self):
            """模拟命令执行过程"""
            print("   -> 执行命令...")
    
    # 5. 演示真实的参数获取
    print("\n5. 真实的参数获取机制:")
    print("   ┌─ setup() 函数被调用")
    print("   ├─ 创建 Distribution 对象，传入 kwargs")
    print("   ├─ Distribution.__init__() 内部:")
    print("   │  ├─ 保存传入的包信息 (name, version, etc.)")
    print("   │  ├─ 读取 sys.argv 获取命令行参数")
    print("   │  ├─ 解析命令和选项")
    print("   │  └─ 读取配置文件和环境变量")
    print("   ├─ 根据命令行参数执行对应的 Command")
    print("   └─ 每个 Command 可以访问:")
    print("      ├─ Distribution 对象 (包含包信息)")
    print("      ├─ 命令行选项")
    print("      └─ 环境变量")

# 6. 实际测试
print("\n=== 实际测试不同参数来源 ===")

print("\n6. 环境变量影响:")
test_env_vars = ['DISTUTILS_DEBUG', 'CC', 'CXX', 'CFLAGS']
for var in test_env_vars:
    value = os.environ.get(var)
    if value:
        print(f"   {var} = {value}")
    else:
        print(f"   {var} = (未设置)")

print("\n7. sys.argv 的作用:")
print(f"   当前 sys.argv: {sys.argv}")
print("   setup() 会直接读取 sys.argv 来决定执行什么操作")

print("\n8. 总结:")
print("   setup() 函数通过以下方式获取参数:")
print("   ✓ 函数参数 (kwargs) - 包的静态信息")
print("   ✓ sys.argv - 运行时命令和选项")  
print("   ✓ 环境变量 - 编译器设置等")
print("   ✓ 配置文件 - setup.cfg, pyproject.toml 等")
print("   ✗ 不是通过全局变量传递") 